// background.js
// 暂无内容
/**
 * pay99 项目请求解密工具函数 - 浏览器插件版本
 * 用于解密基于 AES + 动态密钥的加密响应数据
 * 
 * @param {string} encryptedData - 加密后的响应数据（base64字符串）
 * @param {string} url - 请求的URL
 * @param {Object} headers - 请求头信息
 * @param {Object} requestData - 请求体数据（用于推算密钥）
 * @returns {Object|null} 解密后的数据对象，解密失败返回null
 */
function decryptPay99Response(encryptedData, url, headers = {}, requestData = {}) {
    try {
        // 1. 从请求头提取必要参数
        const traceId = headers['trace-id'] || headers['TraceId'] || headers['traceId'];
        const uuid = headers['uuid'] || headers['UUID'];
        const timestamp = headers['time'] || headers['timestamp'];

        // 2. 生成密钥（模拟前端逻辑）
        const timestampKey = generateTimestampKey(timestamp, traceId);

        // 3. 执行解密
        const decryptedData = decryptAES(encryptedData, timestampKey);

        // 4. 解析JSON
        return JSON.parse(decryptedData);

    } catch (error) {
        console.error('解密失败:', error);
        return null;
    }
}

/**
 * 生成时间戳密钥（模拟前端逻辑）
 * @param {string|number} timestamp - 时间戳
 * @param {string} traceId - 追踪ID
 * @returns {string} 16位密钥
 */
function generateTimestampKey(timestamp, traceId) {
    const timestampStr = timestamp ? timestamp.toString() : Date.now().toString();
    const traceIdStr = traceId || '';
    const combined = timestampStr + traceIdStr;
    return combined.slice(0, 16);
}

/**
 * AES解密函数（ECB模式 + Pkcs7填充）
 * @param {string} encryptedData - base64加密数据
 * @param {string} key - 16位密钥
 * @returns {string} 解密后的字符串
 */
function decryptAES(encryptedData, key) {
    // 确保密钥长度为16位
    const paddedKey = key.padEnd(16, '0').slice(0, 16);

    // 使用 Web Crypto API 进行解密（浏览器原生支持）
    return decryptWithWebCrypto(encryptedData, paddedKey);
}

/**
 * 使用 Web Crypto API 进行 AES 解密
 * @param {string} encryptedData - base64加密数据
 * @param {string} key - 16位密钥
 * @returns {string} 解密后的字符串
 */
async function decryptWithWebCrypto(encryptedData, key) {
    try {
        // 将base64转换为ArrayBuffer
        const encryptedBytes = Uint8Array.from(atob(encryptedData), c => c.charCodeAt(0));

        // 导入密钥
        const keyBuffer = new TextEncoder().encode(key);
        const cryptoKey = await crypto.subtle.importKey(
            'raw',
            keyBuffer,
            { name: 'AES-CBC' }, // 注意：Web Crypto API 不支持 ECB，这里用 CBC 模式
            false,
            ['decrypt']
        );

        // 解密（需要提供 IV，这里用全零）
        const iv = new Uint8Array(16);
        const decryptedBuffer = await crypto.subtle.decrypt(
            { name: 'AES-CBC', iv: iv },
            cryptoKey,
            encryptedBytes
        );

        // 转换为字符串
        return new TextDecoder().decode(decryptedBuffer);

    } catch (error) {
        console.error('Web Crypto API 解密失败:', error);
        // 如果 Web Crypto API 失败，尝试使用 crypto-js（需要引入）
        return decryptWithCryptoJS(encryptedData, key);
    }
}

/**
 * 使用 crypto-js 进行 AES 解密（备用方案）
 * @param {string} encryptedData - base64加密数据
 * @param {string} key - 16位密钥
 * @returns {string} 解密后的字符串
 */
function decryptWithCryptoJS(encryptedData, key) {
    // 检查是否已加载 crypto-js
    if (typeof CryptoJS === 'undefined') {
        throw new Error('CryptoJS 未加载，请确保在插件中引入了 crypto-js');
    }

    const paddedKey = key.padEnd(16, '0').slice(0, 16);

    // 执行AES解密
    const decrypt = CryptoJS.AES.decrypt(encryptedData, CryptoJS.enc.Utf8.parse(paddedKey), {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7,
    });

    // 转换为UTF8字符串
    return decrypt.toString(CryptoJS.enc.Utf8);
}

/**
 * 批量解密响应数据
 * @param {Array} responses - 响应数据数组，每个元素包含 {data, url, headers, requestData}
 * @returns {Array} 解密后的数据数组
 */
function batchDecryptPay99Responses(responses) {
    return responses.map(item => {
        const decrypted = decryptPay99Response(
            item.data,
            item.url,
            item.headers,
            item.requestData
        );
        return {
            original: item,
            decrypted: decrypted,
            success: decrypted !== null
        };
    });
}

// 导出函数（浏览器插件环境）
if (typeof window !== 'undefined') {
    window.Pay99Decryptor = {
        decryptPay99Response,
        generateTimestampKey,
        decryptAES,
        decryptWithWebCrypto,
        decryptWithCryptoJS,
        batchDecryptPay99Responses
    };
}

// 监听来自面板的消息
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    if (request.action === 'sendRequest') {
        handleSendRequest(request, sendResponse);
        return true; // 保持消息通道开放
    }
});

async function handleSendRequest(request, sendResponse) {
    try {
        const { url, method, headers, body } = request;

        const fetchOptions = {
            method: method,
            headers: headers
        };

        if (method !== 'GET' && body) {
            fetchOptions.body = body;
        }

        const response = await fetch(url, fetchOptions);
        const responseText = await response.text();

        sendResponse({
            success: response.ok,
            status: response.status,
            statusText: response.statusText,
            data: responseText,
            headers: Object.fromEntries(response.headers.entries())
        });
    } catch (error) {
        sendResponse({
            success: false,
            status: 0,
            statusText: 'Network Error',
            data: `错误: ${error.message}`,
            headers: {}
        });
    }
}